package ch01
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;
	import flash.geom.Matrix;
	import flash.geom.Point;

	import tools.Star;

	/**
	 * 检测不规则图形之间的碰撞(五角星)
	 * @author jianping.shenjp
	 *
	 */
	public class BitmapCollision1 extends Sprite
	{
		private var bmpd1:BitmapData;
		private var bmp1:Bitmap;
		private var bmpd2:BitmapData;
		private var bmp2:Bitmap;

		public function BitmapCollision1()
		{
			stage.align=StageAlign.TOP_LEFT;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			// make a star
			var star:Star=new Star(50);
			// make a fixed bitmap, draw the star into it
			bmpd1=new BitmapData(100, 100, true, 0);
			bmpd1.draw(star, new Matrix(1, 0, 0, 1, 50, 50));
			bmp1=new Bitmap(bmpd1);
			bmp1.x=200;
			bmp1.y=200;
			addChild(bmp1);
			// make a moveable bitmap, draw the star into it, too
			bmpd2=new BitmapData(100, 100, true, 0);
			bmpd2.draw(star, new Matrix(1, 0, 0, 1, 50, 50));
			bmp2=new Bitmap(bmpd2);
			addChild(bmp2);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoving);
		}

		private function onMouseMoving(event:MouseEvent):void
		{
			// move bmp2 to the mouse position (centered).
			bmp2.x=event.stageX - 50;
			bmp2.y=event.stageY - 50;
			// the hit test itself.

			/**
			   hitTest () 方法
			   public function hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean

			   在一个位图图像与一个点、矩形或其他位图图像之间执行像素级的点击检测。根据定义，点击区域是指一个不透明像素或两个重叠的不透明像素上的点或矩形的重叠部分。在执行点击测试时，将不会考虑两个对象中任何一个对象的拉伸、旋转或其他变形。
			   如果某个图像是不透明图像，则此方法会将其视为完全不透明的矩形。两个图像必须是透明图像才能执行判断透明度的像素级点击测试。当您在测试两个透明图像时，Alpha 阈值参数将控制哪些 Alpha 通道值（从 0 到 255）将被视为是不透明的。

			   参数 :
			   firstPoint:Point — 任意坐标空间中 BitmapData 图像的左上角的位置。在定义 secondBitmapPoint 参数时，使用了相同的坐标空间。
			   firstAlphaThreshold:uint — 最小的 Alpha 通道值，此点击测试将其视为不透明的。
			   secondObject:Object — 一个 Rectangle、Point、Bitmap 或 BitmapData 对象。
			   secondBitmapDataPoint:Point (default = null) — 一个点，用于定义第二个 BitmapData 对象中的一个像素位置。仅当 secondObject 的值是 BitmapData 对象时使用此参数。
			   secondAlphaThreshold:uint (default = 1) — 最小的 Alpha 通道值，它在第二个 BitmapData 对象中被视为不透明的。仅当 secondObject 的值是 BitmapData 对象，并且这两个 BitmapData 对象都为透明时使用此参数。
			   返回:
			   Boolean — 如果发生点击，则值为 true；否则为 false。
			 */
			/**
			 * hitTest(一个点: Point, 一个透明阈值: uint, 另一个对象: Object, 另一个点: Point, 另一个透明阈值: uint);
			 * 注意到这5个参数被分成了两组：一个和另一个。
			 * 每组都需要一个点来确定位图的左上角起点。
			 * 这是因为每个位图所在的坐标系可能不一样，有的在别的元件里，或者元件的元件里。
			 * 给定点只是为了统一坐标系，如果必要，点可以通过DisplayObject.localToGlobal来统一。
			 * 例子中两个位图都正好在场景上，所以可以直接使用各自的相对位置。
			 * */
			/**
			 * hitTest方法第三个参数允许传递的可以是一个点(Point)，一个矩形(Rectangle)或者另一个位图对象 (BitmapData)。
			 * 如果传一个点或者一个矩形，那么后面的两个参数可以忽略。检测和点的碰撞一般是用于鼠标是否接触位图，
			 * 例子：
			 * if(myBitmpData.hitTest(new Point(myBitmapData.x, myBitmapData.y), 255, new Point(mouseX, mouseY))) { // 鼠标碰到位图啦 }
			 * */
			/**
			 * 若阈值均为0x00(完全透明)，则会检测所占矩形位置是否碰撞
			 * */
			if (bmpd1.hitTest(new Point(bmp1.x, bmp1.y), 0xFF, bmpd2, new Point(bmp2.x, bmp2.y), 0xFF))
			{
				bmp1.filters=[new GlowFilter()];
				bmp2.filters=[new GlowFilter()];
			}
			else
			{
				bmp1.filters=[];
				bmp2.filters=[];
			}
		}


	}
}